package controladores;

import entidades.ArsARTICULO;
import entidades.ArsFAMILIA;
import entidades.ArsPERFILCONTABLE;
import entidades.ArsPERFILIMPOSITIVO;
import entidades.ArsPERFILVENTAS;
import entidades.ArsSUBFAMILIA;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import renders.ArticulosRender;

import java.util.List;

import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.util.GenericForwardComposer;
import org.zkoss.zul.ListModel;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Listbox;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Button;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Textbox;

import org.zkoss.zul.Window;

public class ArticulosViewController extends GenericForwardComposer {

    Listbox articuloListBox;

   Textbox filtro;
    Combobox seleccionCampo;
    Checkbox filtroContiene;
    Button nuevoArticuloBtn;
    Button borraArticuloBtn;
    Button editarArticuloBtn;

    //Elementos de formulario nuevo
    Window winEdit;
    Window winNew;
    Button saveArticuloNew;
    Textbox txtCodigoNew;
    Textbox txtDescripcionNew;
    Textbox txtAliasNew;
    Textbox txtSeleccionNew;
    Textbox txtTipoNew;

    Textbox valore;
    
    //Elementos de formulario edicion
    Button saveArticuloEdit;
    Textbox txtCodigoEdit;
    Textbox txtDescripcionEdit;
    Textbox txtAliasEdit;
    Textbox txtSeleccionEdit;
    Textbox txtTipoEdit;
    ArsARTICULO articuloToEdit = new ArsARTICULO();
    
    @Override
    @SuppressWarnings("unchecked")
    public void doAfterCompose(Component comp) throws Exception {
        super.doAfterCompose(comp);

        articuloListBox.setModel(getArticulosModel());
        articuloListBox.setItemRenderer(new ArticulosRender());
        
        borraArticuloBtn.setDisabled(true);
        editarArticuloBtn.setDisabled(true);
        seleccionCampo.setSelectedIndex(0);
        valore.setValue("lalala2");
    }
    
    public void refreshList() {
        articuloListBox.setModel(getArticulosModel());
        articuloListBox.setItemRenderer(new ArticulosRender());
    }

    public ListModel getArticulosModel() {
        List articulos;
        EntityManagerFactory emf;

        emf = Persistence.createEntityManagerFactory("ProyectoConarpesaPU");

        EntityManager em;

        em = emf.createEntityManager();

        javax.persistence.Query q = em.createQuery("SELECT c FROM ArsARTICULO AS c");
        articulos = q.getResultList();
        return new ListModelList(articulos);
    }

    public void onChange$filtro() {

        articuloListBox.setModel(getArticulosByFilter());
        articuloListBox.setItemRenderer(new ArticulosRender());
    }

    public void onSelect$articuloListBox() {
        ListModel articulosModel = articuloListBox.getModel();
        articuloToEdit = (ArsARTICULO) articulosModel.getElementAt(articuloListBox.getSelectedIndex());
        valore.setValue(articuloToEdit.getCodigo());
        editarArticuloBtn.setDisabled(false);
        borraArticuloBtn.setDisabled(false);
    }
    
    public void onSelect$seleccionCampo() {
        //Messagebox.show("Entramos a onChanged$filtroApellido", "Error", Messagebox.ABORT, Messagebox.ERROR);
        articuloListBox.setModel(getArticulosByFilter());
        articuloListBox.setItemRenderer(new ArticulosRender());
    }

    public void onCheck$filtroContiene() {

        articuloListBox.setModel(getArticulosByFilter());
        articuloListBox.setItemRenderer(new ArticulosRender());
    }

    public ListModel getArticulosByFilter() {
        List articulos;
        EntityManagerFactory emf;
        String seleccionCampoValue;
        String sql;
        String campoElegido;

        emf = Persistence.createEntityManagerFactory("ProyectoConarpesaPU");

        EntityManager em;

        em = emf.createEntityManager();

        seleccionCampoValue = seleccionCampo.getSelectedItem().getLabel();
        campoElegido = "descripcion";

        switch (seleccionCampoValue) {
            case "campo codigo":
                campoElegido = "codigo";
                break;
            case "campo descripcion":
                campoElegido = "descripcion";
                break;
            case "campo alias":
                campoElegido = "alias";
                break;
            case "campo seleccion":
                campoElegido = "seleccion";
                break;
            case "campo tipo":
                campoElegido = "tipo";
                break;
        }

        sql = "SELECT c FROM ArsARTICULO AS c WHERE c." + campoElegido + " LIKE :valorFiltro ORDER BY c." + campoElegido + " ASC";

        javax.persistence.Query q = em.createQuery(sql);

        if (filtroContiene.isChecked()) {
            q.setParameter("valorFiltro", "%" + filtro.getValue() + "%");
        } else {
            q.setParameter("valorFiltro", filtro.getValue() + "%");
        }

        return new ListModelList(q.getResultList());
    }

    public void onClick$nuevoArticuloBtn() {
        winNew.doModal();
        winNew.setVisible(true);

    }

    public void onClick$editarArticuloBtn() {
        
        
        /*
        txtCodigoEdit.setValue(articuloToEdit.getCodigo());
        txtDescripcionEdit.setValue(articuloToEdit.getDescripcion());
        txtAliasEdit.setValue(articuloToEdit.getAlias());
        txtSeleccionEdit.setValue(articuloToEdit.getSeleccion());
        txtTipoEdit.setValue(articuloToEdit.getTipo());
        */
        //valore.setValue(txtCodigoEdit.getValue());
        //txtCodigoEdit.setValue("articuloToEdit.getCodigo()");
        //txtDescripcionEdit.setValue("articuloToEdit.getDescripcion()");
        //txtAliasEdit.setValue("articuloToEdit.getAlias()");
        //txtSeleccionEdit.setValue("articuloToEdit.getSeleccion()");
        //txtTipoEdit.setValue("articuloToEdit.getTipo()");
        
        winEdit.doModal();
        winEdit.setVisible(true);
        
        
        
    }
    
    public void onClick$borraArticuloBtn() {
        ListModel articulosModel = articuloListBox.getModel();
        final ArsARTICULO articulo = (ArsARTICULO) articulosModel.getElementAt(articuloListBox.getSelectedIndex());
        
        
        Messagebox.show("Realmente desea eliminar el articulo "+articulo.getDescripcion()+" ?", 
            "Eliminar Articulo", Messagebox.OK | Messagebox.CANCEL,
            Messagebox.QUESTION,
                new org.zkoss.zk.ui.event.EventListener(){
                    public void onEvent(Event e){
                        if(Messagebox.ON_OK.equals(e.getName())){
                            // Aprete OK
                            EntityManagerFactory emf;
                            emf = Persistence.createEntityManagerFactory("ProyectoConarpesaPU");
                            EntityManager em = emf.createEntityManager();

                            try {
                                em.getTransaction().begin();
                                ArsARTICULO articuloToDelete = em.merge(articulo);
                                em.remove(articuloToDelete);
                                em.getTransaction().commit();
                                articuloListBox.setModel(getArticulosModel());
                                articuloListBox.setItemRenderer(new ArticulosRender());
                                Messagebox.show("Artículo eliminado ", "Eliminado", Messagebox.OK, Messagebox.INFORMATION);
                            } catch (Exception ex) {
                                Messagebox.show("Error eliminando el Artículo " + ex.toString(), "Error Eliminando", Messagebox.ABORT, Messagebox.ERROR);
                            }
                        }else if(Messagebox.ON_CANCEL.equals(e.getName())){
                            // Aprete CANCEL
                        }
                    }
                }
            );
      
    }

    /*public void onClick$editarArticuloBtn() {
        ListModel articulosModel = articuloListBox.getModel();
        articuloToEdit = (ArsARTICULO) articulosModel.getElementAt(articuloListBox.getSelectedIndex());
        
/*
        txtDescripcionEdit.setValue(articuloToEdit.getDescripcion());
        txtAliasEdit.setValue(articuloToEdit.getAlias());
        txtSeleccionEdit.setValue(articuloToEdit.getSeleccion());
        txtTipoEdit.setValue(articuloToEdit.getTipo());
*//*
        winEdit.setVisible(true);
    }*/

        
    public void onClick$saveArticuloNew() {
        EntityManagerFactory emf;
        emf = Persistence.createEntityManagerFactory("ProyectoConarpesaPU");
        EntityManager em = emf.createEntityManager();

        TypedQuery<ArsFAMILIA> queryFamilia = em.createNamedQuery("ArsFAMILIA.findAll", ArsFAMILIA.class);
        List<ArsFAMILIA> familiaResult = queryFamilia.getResultList();
        ArsFAMILIA familia = familiaResult.get(0);

        javax.persistence.Query querySubFamilia = em.createQuery("SELECT c FROM ArsSUBFAMILIA AS c WHERE c.arsSUBFAMILIAPK.familia = :familia");
        querySubFamilia.setParameter("familia", familia.getCodigo());
        List<ArsSUBFAMILIA> subFamiliaResult = querySubFamilia.getResultList();

        TypedQuery<ArsPERFILCONTABLE> queryPerfilContable = em.createNamedQuery("ArsPERFILCONTABLE.findAll", ArsPERFILCONTABLE.class);
        List<ArsPERFILCONTABLE> perfilContableResult = queryPerfilContable.getResultList();

        TypedQuery<ArsPERFILIMPOSITIVO> queryPerfilImpositivo = em.createNamedQuery("ArsPERFILIMPOSITIVO.findAll", ArsPERFILIMPOSITIVO.class);
        List<ArsPERFILIMPOSITIVO> perfilImpositivoResult = queryPerfilImpositivo.getResultList();

        TypedQuery<ArsPERFILVENTAS> queryPerfilVentas = em.createNamedQuery("ArsPERFILVENTAS.findAll", ArsPERFILVENTAS.class);
        List<ArsPERFILVENTAS> perfilVentasResult = queryPerfilVentas.getResultList();

        /*     
         Messagebox.show("Familia "+familia.getCodigo()+
         "/nSubfamilia "+subFamiliaResult.get(0).getArsSUBFAMILIAPK().getCodigo()+
         "/nPerfilContable "+perfilContableResult.get(0).getCodigo()+
         "/nPerfilImpositivo "+perfilImpositivoResult.get(0).getCodigo()+
         "/nPerfilVentas "+perfilVentasResult.get(0).getCodigo(),"Vemos datos", Messagebox.OK, Messagebox.INFORMATION);
         */
        ArsARTICULO newArticulo = new ArsARTICULO();

        newArticulo.setCodigo(txtCodigoNew.getValue());
        newArticulo.setDescripcion(txtDescripcionNew.getValue());
        newArticulo.setAlias(txtAliasNew.getValue());
        newArticulo.setSeleccion(txtSeleccionNew.getValue());
        newArticulo.setTipo(txtTipoNew.getValue());

        newArticulo.setFamilia(familia);
        newArticulo.setArsSUBFAMILIA(subFamiliaResult.get(0));
        newArticulo.setPerfilContable(perfilContableResult.get(0));
        newArticulo.setPerfilImpositivo(perfilImpositivoResult.get(0));
        newArticulo.setPerfilVentas(perfilVentasResult.get(0));

        try {

            em.getTransaction().begin();
            em.persist(newArticulo);
            em.getTransaction().commit();
            refreshList();
            cierroVentana();

            Messagebox.show("Artículo guardado correctamente", "Guardando Artículos", Messagebox.OK, Messagebox.INFORMATION);

        } catch (Exception ex) {
            Messagebox.show("Error guardado el Artículo " + ex.toString(), "Error Guardando", Messagebox.ABORT, Messagebox.ERROR);
        }
    }

    public void cierroVentana() {
        winNew.setVisible(false);
    }
}
